package com.agricultural.environment;

import com.agricultural.observer.Observable;
import com.agricultural.observer.Observer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 环境监测类 - 实现被观察对象接口
public class EnvironmentMonitor implements Observable {
    private List<Observer> observers;        // 观察者列表
    private Map<String, Object> environmentData; // 环境数据
    
    // 构造函数
    public EnvironmentMonitor() {
        this.observers = new ArrayList<>();
        this.environmentData = new HashMap<>();
        // 初始化环境数据
        initEnvironmentData();
    }
    
    // 初始化环境数据
    private void initEnvironmentData() {
        environmentData.put("soilMoisture", 60.0);  // 土壤湿度 (%)
        environmentData.put("soilPH", 7.0);         // 土壤pH值
        environmentData.put("temperature", 25.0);   // 温度 (°C)
        environmentData.put("humidity", 65.0);      // 湿度 (%)
        environmentData.put("windSpeed", 3.0);      // 风速 (m/s)
        environmentData.put("cropGrowth", 75.0);    // 作物生长状态 (%)
    }
    
    // 注册观察者
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
        System.out.println("注册观察者: " + observer.getClass().getSimpleName());
    }
    
    // 移除观察者
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
        System.out.println("移除观察者: " + observer.getClass().getSimpleName());
    }
    
    // 通知所有观察者
    @Override
    public void notifyObservers(Map<String, Object> data) {
        System.out.println("通知所有观察者: 环境数据已更新");
        for (Observer observer : observers) {
            observer.update(data);
        }
    }
    
    // 更新环境数据
    public void updateEnvironmentData(String parameter, Object value) {
        environmentData.put(parameter, value);
        System.out.println("环境数据更新: " + parameter + " = " + value);
        
        // 创建一个包含更新数据的Map
        Map<String, Object> updateData = new HashMap<>();
        updateData.put(parameter, value);
        
        // 通知所有观察者
        notifyObservers(updateData);
    }
    
    // 获取当前环境数据
    public Map<String, Object> getEnvironmentData() {
        return new HashMap<>(environmentData);
    }
}    